#include "hdl_lcd12864.h"

void hdl_lcd12864_driver_config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    GPIO_InitStructure.GPIO_Pin = DRV_74HC595_CLK|DRV_74HC595_DAT_IN|DRV_74HC595_DAT_LOK|DRV_74HC595_DAT_CLR|\
                                  DRV_LCD12864_EN|DRV_LCD12864_RST|DRV_LCD12864_RW|DRV_LCD12864_RS|DRV_LCD12864_CS1|DRV_LCD12864_CS2;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(DRV_GPIO_PORT,&GPIO_InitStructure);

    GPIO_ResetBits(DRV_GPIO_PORT,DRV_74HC595_CLK);
    GPIO_ResetBits(DRV_GPIO_PORT,DRV_74HC595_DAT_IN);
    GPIO_ResetBits(DRV_GPIO_PORT,DRV_74HC595_DAT_LOK);
    GPIO_SetBits(DRV_GPIO_PORT,DRV_74HC595_DAT_CLR);

    GPIO_SetBits(DRV_GPIO_PORT,DRV_LCD12864_EN);
    GPIO_SetBits(DRV_GPIO_PORT,DRV_LCD12864_RST);
    GPIO_ResetBits(DRV_GPIO_PORT,DRV_LCD12864_RW);
    GPIO_ResetBits(DRV_GPIO_PORT,DRV_LCD12864_RS);
    GPIO_SetBits(DRV_GPIO_PORT,DRV_LCD12864_CS1);
    GPIO_ResetBits(DRV_GPIO_PORT,DRV_LCD12864_CS2);
}

int8_t hdl_74hc595_byte_write(uint8_t dat)
{
    uint8_t i = 0;
    GPIO_ResetBits(DRV_GPIO_PORT,DRV_74HC595_DAT_LOK);
    for (i = 0; i < 8; i++)
    {
        GPIO_ResetBits(DRV_GPIO_PORT,DRV_74HC595_CLK);
        if (dat & (1 << i))
        {
            GPIO_SetBits(DRV_GPIO_PORT,DRV_74HC595_DAT_IN);
        }
        else
        {
            GPIO_ResetBits(DRV_GPIO_PORT,DRV_74HC595_DAT_IN);
        }
        GPIO_SetBits(DRV_GPIO_PORT,DRV_74HC595_CLK);
        SysTick_Delay_Us(4);
    }
    GPIO_SetBits(DRV_GPIO_PORT,DRV_74HC595_DAT_LOK);
    return 0;
}
